/*
 * Copyright 2010 Gal Dolber.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.guit.client.async;

import com.google.gwt.event.shared.EventBus;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;

import com.guit.client.GuitEntryPoint;
import com.guit.client.async.event.AsyncActivityEvent;
import com.guit.client.async.event.AsyncExceptionEvent;

/**
 * IMPORTANT: Do not save an instance of this class. <br/>
 * It is designed to be instantiated at the time you use it. <br/>
 * Otherwise the AsyncActivityEvent will get fired wrong.
 */
public abstract class AbstractRequestCallback implements RequestCallback {

  private static final EventBus eventBus = GuitEntryPoint.getEventBus();

  public AbstractRequestCallback() {
    eventBus.fireEvent(AsyncActivityEvent.START);
  }

  public void failure(Request request, Throwable caught) {
  }

  @Override
  public void onError(Request request, Throwable exception) {
    eventBus.fireEvent(AsyncActivityEvent.END);
    eventBus.fireEvent(new AsyncExceptionEvent(exception));
    failure(request, exception);
  }

  @Override
  public void onResponseReceived(Request request, Response response) {
    eventBus.fireEvent(AsyncActivityEvent.END);
    success(request, response);
  }

  public abstract void success(Request request, Response response);
}
